package org.epanetgrid.otimizacao;

import java.util.Collection;

import org.jheuristics.ga.Evolver;

/**
 * Os otimizadores devem implementar esta interface
 * @author vinicius
 *
 */
public interface OtimizadorObservable {

    /**
     * Inicia o otimizador
     */
    public void start();

    /**
     * 
     */
    public void restart();
    
    /**
     * Para o otimizador
     */
    public void stop();

    /**
     * Pausa o otimizador
     */
    public void pause();
    
    /**
     * Adiciona um Observer para receber eventos gerados por
     * este otimizador
     * @param observer Novo observer
     */
    public void addObserver(OtimizadorObserver observer);
    
    /**
     * Retorna os observers do otimizador
     * @return Collections dos observers
     */
    public Collection<OtimizadorObserver> getObservers();
    
    /**
     * Deleta um observer espec�fico
     * @param observer Objeto a ser deletado
     */
    public void deleteObserver(OtimizadorObserver observer);

    /**
     * Deleta todos os observers 
     */
    public void deleteObservers();

    /**
     * @return Retorna o Evolver utilizado pelo otimizador
     */
    public Evolver getEvolver();

    /**
     * @return
     */
    public boolean isStoped();
    
    /**
     * 
     * @param evolver Altera o evolver utilizado no otimizador
     */
    public void setEvolver(Evolver evolver);

}